/*
 * AterrizarWebService.java
 *
 * Created on 13 de noviembre de 2007, 19:25
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package com.fiuba.aterrizar.servidor.interfaz.integracion;

import com.fiuba.aterrizar.servidor.conf.ObjectFactory;
import com.fiuba.aterrizar.servidor.dto.DatosParaReservaDTO;
import com.fiuba.aterrizar.servidor.dto.RespuestaServicioDTO;
import com.fiuba.aterrizar.servidor.exception.DatosInvalidosException;
import com.fiuba.aterrizar.servidor.exception.ReservaAsientoException;
import com.fiuba.aterrizar.servidor.exception.ReservaExistenteException;
import com.fiuba.aterrizar.servidor.exception.ReservaInexistenteException;
import com.fiuba.aterrizar.servidor.exception.ReservaInvalidaException;
import com.fiuba.aterrizar.servidor.exception.UsuarioInvalidoException;
import com.fiuba.aterrizar.servidor.exception.VueloInvalidoException;
import com.fiuba.aterrizar.servidor.service.ReservaService;
import com.fiuba.aterrizar.servidor.service.SeguridadService;
import com.sun.org.apache.commons.collections.Factory;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

/**
 *
 * @author Demian
 */
@WebService()
public class AterrizarWebService {
    /**
     * Web service operation
     */
    @WebMethod
    public String sayHelloWorld() {        
        return "HELLO FUCKING WORLD!!";
    }

    /**
     * Web service operation
     */
    @WebMethod
    public RespuestaServicioDTO reservar(@WebParam(name = "idVuelo") String idVuelo, @WebParam(name = "claseVuelo") String claseVuelo, @WebParam(name = "numeroTransaccion") String numeroTransaccion, @WebParam(name = "idUsuario") String idUsuario, @WebParam(name = "passwUsuario") String passwUsuario) {
        RespuestaServicioDTO respuesta = new RespuestaServicioDTO();
        //validar el usuario
        try {            
            validarUsuario(idUsuario, passwUsuario);
        } catch (UsuarioInvalidoException ex) {
            respuesta.setErrores("Usuario invalido!");
            return respuesta;
        }
        
        DatosParaReservaDTO datosReserva = new DatosParaReservaDTO();
        datosReserva.setClaseVuelo(claseVuelo);
        datosReserva.setIdUsuario(idUsuario);
        datosReserva.setCodigoVuelo(idVuelo);
        datosReserva.setNumeroTransaccion(numeroTransaccion);
        datosReserva.setPasswUsuario(passwUsuario);
        
        //validar datos
        try {
            validarDatosObligatoriosServicioReserva(datosReserva);
        } catch (DatosInvalidosException ex) {
            respuesta.setErrores("Faltan parametros!");
            return respuesta;
        }
        
        //hacer la reserva        
        try {
            ReservaService reservaService = (ReservaService) ObjectFactory.getObject(ReservaService.class);
            reservaService.reservar(datosReserva);
        }catch (ReservaAsientoException ex){
            respuesta.setErrores("No hay mas asientos");
            return respuesta;            
        }catch (VueloInvalidoException ex){
            respuesta.setErrores("El vuelo no existe");
            return respuesta;
        }catch (ReservaExistenteException ex) {
            respuesta.setErrores("La reserva ya existe!");
            return respuesta;
        }catch (ReservaInvalidaException ex) {
            respuesta.setErrores("Error inesperado con la reserva");
            return respuesta;
        }
        
        respuesta.setNumeroTransaccion("3248273489");        
        return respuesta;
    }
    
    
    private void validarDatosObligatoriosServicioReserva(DatosParaReservaDTO datosReserva) throws DatosInvalidosException{
        if (datosReserva.getCodigoVuelo() == null){
            throw new DatosInvalidosException();
        }
    }

    /**
     * Web service operation
     */
    @WebMethod
    public RespuestaServicioDTO efectivizarReserva(@WebParam(name = "numeroTransaccion") String numeroTransaccion, @WebParam(name = "idUsuario") String idUsuario, @WebParam(name = "passwUsuario") String passwUsuario) {
        RespuestaServicioDTO respuesta = new RespuestaServicioDTO();
        //validar el usuario
        try {            
            validarUsuario(idUsuario, passwUsuario);
        } catch (UsuarioInvalidoException ex) {
            respuesta.setErrores("Usuario invalido!");
            return respuesta;
        }
        
        try {
            ReservaService reservaService = (ReservaService) ObjectFactory.getObject(ReservaService.class);
            reservaService.efectivizarReserva(numeroTransaccion,idUsuario);
        } catch (ReservaInexistenteException ex) {
            respuesta.setErrores("Reserva inexistente!");
            return respuesta;
        }
        
        respuesta.setNumeroTransaccion(numeroTransaccion);
        
        return respuesta;
    }
    
    @WebMethod
    public RespuestaServicioDTO comprar(@WebParam(name = "idVuelo") String idVuelo, @WebParam(name = "claseVuelo") String claseVuelo, @WebParam(name = "numeroTransaccion") String numeroTransaccion, @WebParam(name = "idUsuario") String idUsuario, @WebParam(name = "passwUsuario") String passwUsuario) {
        RespuestaServicioDTO respuesta = new RespuestaServicioDTO();
        //validar el usuario
        try {            
            validarUsuario(idUsuario, passwUsuario);
        } catch (UsuarioInvalidoException ex) {
            respuesta.setErrores("Usuario invalido!");
            return respuesta;
        }
        
        respuesta = reservar(idVuelo, claseVuelo, numeroTransaccion, idUsuario, passwUsuario);
        if (respuesta.getErrores() != null){
            return respuesta;
        }
        
        respuesta = efectivizarReserva(numeroTransaccion, idUsuario, passwUsuario);
        if (respuesta.getErrores() != null){
            return respuesta;
        }
        
        respuesta.setNumeroTransaccion(numeroTransaccion);
        
        return respuesta;
    }
    
    private void validarUsuario(String idUsuario, String passwUsuario) throws UsuarioInvalidoException{                
        SeguridadService seguridadService = (SeguridadService) ObjectFactory.getObject(SeguridadService.class);
        seguridadService.validarUsuario(idUsuario, passwUsuario);        
    }
    

    
}
